﻿using System;
using System.Data;
using System.Data.OleDb;

namespace Gestión_UTN.daimpl
{
    public class usuariodaimpl : da.usuarioda
    {
        public usuariodaimpl()
        {

        }

        public bool SaveUsuario(int dni, string nombre, string apellido, string usuario, string password, string posicion)
        {
            bool ingresado = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "INSERT INTO usu_usuarios(usu_dni, usu_nombre, usu_apellido, usu_usuario, usu_password, usu_posicion, usu_activo)" +
                                "VALUES(@usu_dni, @usu_nombre, @usu_apellido, @usu_usuario, @usu_password, @usu_posicion,true)";



                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand insertar = new OleDbCommand(sql, conex, trans);

                    insertar.Parameters.AddWithValue("@usu_dni", dni);
                    insertar.Parameters.AddWithValue("@usu_nombre", nombre);
                    insertar.Parameters.AddWithValue("@usu_apellido", apellido);
                    insertar.Parameters.AddWithValue("@usu_usuario", usuario);
                    insertar.Parameters.AddWithValue("@usu_password", password);
                    insertar.Parameters.AddWithValue("@usu_posicion", posicion);

                    insertar.ExecuteNonQuery();

                    trans.Commit();

                    ingresado = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                ingresado = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return ingresado;
        }

        public bool DeleteUsuario(int dni)
        {
            bool eliminado = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "UPDATE usu_usuarios SET usu_activo = false WHERE usu_dni = @usu_dni";

                    conex.Open();

                    trans = conex.BeginTransaction();

                    OleDbCommand eliminar = new OleDbCommand(sql, conex, trans);

                    eliminar.Parameters.AddWithValue("@usu_dni", dni);

                    eliminar.ExecuteNonQuery();

                    trans.Commit();

                    eliminado = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                eliminado = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return eliminado;
        }

        public bool ModifyUsuario(int dni_anterior, int dni, string nombre, string apellido, string usuario, string password, string posicion)
        {
            bool modificado = false;

            OleDbConnection conex = null;
            OleDbTransaction trans = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                trans = null;

                if (null != conex)
                {

                    string sql = "UPDATE usu_usuarios SET usu_dni = @usu_dni, usu_nombre = @usu_nombre, usu_apellido = @usu_apellido , " +
                                    "usu_usuario = @usu_usuario, usu_password= @usu_password, usu_posicion = @usu_posicion" +
                                    " WHERE usu_dni = @dni_anterior";

                    conex.Open();
                    trans = conex.BeginTransaction();

                    OleDbCommand modificar = new OleDbCommand(sql, conex, trans);

                    modificar.Parameters.AddWithValue("@usu_dni", dni);
                    modificar.Parameters.AddWithValue("@usu_nombre", nombre);
                    modificar.Parameters.AddWithValue("@usu_apellido", apellido);
                    modificar.Parameters.AddWithValue("@usu_usuario", usuario);
                    modificar.Parameters.AddWithValue("@usu_password", password);
                    modificar.Parameters.AddWithValue("@usu_posicion", posicion);
                    modificar.Parameters.AddWithValue("@dni_anterior", dni_anterior);

                    modificar.ExecuteNonQuery();

                    trans.Commit();

                    modificado = true;

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                modificado = false;
                trans.Rollback();
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return modificado;
        }

        public System.Data.DataTable FindAllUsuarios()
        {
            DataTable tablaUsuarios = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();
                tablaUsuarios = new DataTable();

                if (null != conex)
                {

                    string sql = "SELECT usu_dni, usu_nombre, usu_apellido, usu_usuario, usu_password, usu_posicion" +
                                    " FROM usu_usuarios usu WHERE usu_activo = true";

                    OleDbDataAdapter adaptador = new OleDbDataAdapter(sql, conex);

                    conex.Open();

                    adaptador.Fill(tablaUsuarios);

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                tablaUsuarios = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return tablaUsuarios;
        }

        public Entities.Usuario FindUsuarioByUsuario(string usuario, string password)
        {
            Entities.Usuario user = null;

            OleDbConnection conex = null;

            try
            {
                conex = util.Conexion.conectarAccess();

                if (null != conex)
                {

                    string sql = "SELECT usu_dni, usu_nombre, usu_apellido, usu_usuario, usu_password, usu_posicion" +
                                    " FROM usu_usuarios usu WHERE usu_activo = true " +
                                    " AND usu_usuario = @usuario AND usu_password = @password";

                    conex.Open();

                    OleDbCommand consulta = new OleDbCommand(sql, conex);

                    consulta.Parameters.AddWithValue("@usuario", usuario);
                    consulta.Parameters.AddWithValue("@password", password);

                    OleDbDataReader lector = consulta.ExecuteReader();

                    while (lector.Read())
                    {
                        int dni = Convert.ToInt32(lector[0].ToString());
                        string nombre = lector[1].ToString();
                        string apellido = lector[2].ToString();
                        string posicion = lector[5].ToString();

                        user = new Entities.Usuario();

                        user.Apellido = apellido;

                        user.DNI = dni;

                        user.Nombre = nombre;

                        user.Password = password;

                        user.Posicion = posicion;

                        user.User = usuario;

                    }

                    conex.Close();
                }

            }
            catch (Exception ex)
            {
                user = null;
                conex.Close();

                throw new exceptions.daexception(ex.Message);
            }

            return user;
        }
    }
}
